#ifndef RPC_MPRPC_APPLICATION_H
#define RPC_MPRPC_APPLICATION_H

#include "mprpcconfig.h"
#include "mprpcchannel.h"
#include "mprpccontroller.h"

namespace rpc {

/**
 * @brief RPC框架核心管理类，采用单例模式设计
 * 
 * 该类是整个RPC框架的入口和核心管理者，负责以下功能：
 * 1. 框架初始化（解析命令行参数、加载配置文件）
 * 2. 提供全局唯一的单例实例，确保框架状态统一
 * 3. 管理框架的配置信息，提供配置访问接口
 * 
 * 单例模式的设计保证了框架在全局范围内只有一个管理实例，
 * 避免了配置冲突和状态不一致问题。
 */
class MprpcApplication
{
public:
    /**
     * @brief 框架初始化函数，解析命令行参数并加载配置
     * @param argc 命令行参数数量（同main函数参数）
     * @param argv 命令行参数数组（同main函数参数）
     * 
     * 函数流程：
     * 1. 解析命令行参数，获取配置文件路径（通常通过"-i"选项指定，如./program -i config.conf）
     * 2. 调用MprpcConfig类的接口加载并解析配置文件内容
     * 3. 完成框架所需的其他初始化操作（如日志初始化、网络环境检查等）
     * 注意：该函数需在框架使用前调用，建议在main函数开头执行
     */
    static void Init(int argc, char* argv[]);

    /**
     * @brief 获取单例实例的接口
     * @return 返回MprpcApplication的唯一实例引用
     * 
     * 单例模式的核心接口，确保全局仅存在一个MprpcApplication实例。
     * 内部通过静态局部变量实现懒加载（第一次调用时初始化），线程安全（C++11后静态局部变量初始化线程安全）
     */
    static MprpcApplication& GetInstance();

    /**
     * @brief 获取框架配置对象的接口
     * @return 返回MprpcConfig对象的引用，用于访问配置信息
     * 
     * 通过该接口可获取框架的所有配置项（如RPC服务器地址、端口、超时时间等），
     * 配置信息在Init函数中加载，全局统一通过该接口访问
     */
    static MprpcConfig& GetConfing(); 

private:
    /**
     * @brief 私有构造函数，禁止外部实例化
     * 
     * 单例模式要求构造函数私有化，确保外部无法通过new创建实例，
     * 仅能通过GetInstance()获取唯一实例
     */
    MprpcApplication() {}
    
    /**
     * @brief 禁用拷贝构造函数，移动构造函数，赋值运算符，移动赋值运算符
     * 
     * 防止通过拷贝已有的实例创建新对象，确保单例唯一性
     */
    MprpcApplication(const MprpcApplication&) = delete;
    MprpcApplication(MprpcApplication&&) = delete;
    MprpcApplication& operator=(const MprpcApplication&) = delete;
    MprpcApplication& operator=(MprpcApplication&&) = delete;

private:
    static MprpcConfig m_config;    // 静态配置对象，存储框架所有配置信息
};

}   // namespace rpc

#endif  // RPC_MPRPC_APPLICATION_H